#include "Rectangle.hpp"

namespace red {
	Rectangle::Rectangle(f32 top, f32 left, f32 width, f32 height) : mOrigin(Vector2F(left, top)), mEnd(Vector2F(left + width, top + height)){
	}

	template<class T>
	Rectangle::Rectangle(const Vector2<T> &pTopLeft, const Vector2<T> &pSize)
	:	mOrigin(pTopLeft),
		mEnd   (pTopLeft + pSize)
	{
	}

	void Rectangle::Set(f32 top, f32 left, f32 width, f32 height){
		mOrigin = Vector2F(left, top);
		mEnd = Vector2F(left + width, top + height);
	}

	void Rectangle::SetPosition(const Vector2F &pV){
		Vector2F size(Size());
		mOrigin = pV;
		mEnd = pV + size;
	}

	IntersectionResult Rectangle::Intersects(const Vector2F &pPoint) const{
		if(pPoint.x >= mOrigin.x && pPoint.x <= mEnd.x && pPoint.y >= mOrigin.y && pPoint.y <= mEnd.y)
			return IR_In;
		else
			return IR_Out;
	}

	IntersectionResult Rectangle::Intersects(const Rectangle &Rect) const{
		// Creation du rectangle d'Intersection
		Vector2F newRectOrigin(Math::Max(mOrigin.x, Rect.mOrigin.x), Math::Max(mOrigin.y, Rect.mOrigin.y));
		Vector2F newRectEnd(Math::Min(mEnd.x, Rect.mEnd.x), Math::Min(mEnd.y, Rect.mEnd.y));
		Rectangle newRect(newRectOrigin, newRectEnd);

		if(newRectOrigin.x > newRectEnd.x || newRectOrigin.y > newRectEnd.y)	// Si le rectangle d'Intersection est a l'exterieur d'un des deux rectangles
			return IR_Out;
		else if(newRect == *this || newRect == Rect)							// Si le rectangle d'Intersection est contenu dans un des deux rectangles
			return IR_In;
		else																	// Sinon, une partie seulement est contenue, Intersection simple
			return IR_Intersect;
	}
}
